package com.boot.security.server.common;




import com.boot.security.server.contant.ErrorInfoEnum;
import org.apache.commons.lang3.StringUtils;

/**
 * 结果生成
 *
 * @author: bruce.cheng
 */
public class ResultBuilder {

    /**
     * 成功
     *
     * @param
     * @return com.puman.scrm.model.common.Result<T> 返回结果对象
     * @author bruce.cheng
     * @date 2019-01-24 14:05
     */
    public static <T> Result<T> success() {
        return build(null);
    }

    /**
     * 生成 返回对象
     *
     * @param model 返回对象
     * @return com.puman.scrm.model.common.Result<T> 返回结果对象
     * @author bruce.cheng
     * @date 2019-01-24 14:06
     */
    public static <T> Result<T> build(T model) {
        Result<T> t = new Result<>();
        t.setSuccess(true);
        t.setModel(model);
        return t;
    }

    /**
     * 不包含异常信息，返回结果
     *
     * @param errorCode 错误码
     * @param errorMsg  错误信息
     * @return com.puman.scrm.model.common.Result<T> 返回结果对象
     */
    public static <T> Result<T> error(int errorCode, String errorMsg) {
        return error(errorCode, errorMsg, null);
    }

    /**
     * 包含异常信息，返回结果
     *
     * @param errorCode    错误码
     * @param errorMsg     错误信息
     * @param exceptionMsg 异常消息
     * @return com.puman.scrm.model.common.Result<T> 返回结果对象
     */
    public static <T> Result<T> error(int errorCode, String errorMsg, String exceptionMsg) {
        return error(errorCode, errorMsg, exceptionMsg, null);
    }

    /**
     * 包含异常信息和抛出信息，返回结果
     *
     * @param errorCode    错误码
     * @param errorMsg     错误信息
     * @param exceptionMsg 异常消息
     * @param throwableMsg 抛出错误消息
     * @return com.puman.scrm.model.common.Result<T> 返回结果对象
     */
    public static <T> Result<T> error(int errorCode, String errorMsg, String exceptionMsg, String throwableMsg) {
        Result<T> t = new Result<>();
        t.setSuccess(false);
        t.setErrorCode(errorCode);
        if (StringUtils.isNotBlank(errorMsg)) {
            t.setErrorMsg(errorMsg);
        } else {
            t.setErrorMsg(exceptionMsg);
        }
        t.setThrowableMsg(throwableMsg);
        t.setModel(null);
        return t;
    }

    /**
     * 错误信息
     *
     * @param errorInfoEnum 错误枚举集合
     * @param <T>
     * @return
     */
    public static <T> Result<T> error(ErrorInfoEnum errorInfoEnum) {
        Result<T> t = new Result<>();
        t.setSuccess(false);
        t.setErrorCode(errorInfoEnum.getCode());
        if (StringUtils.isNotBlank(errorInfoEnum.getDesc())) {
            t.setErrorMsg(errorInfoEnum.getDesc());
        } else {
            t.setErrorMsg("");
        }
        t.setModel(null);
        return t;
    }

    /**
     * 参数错误，返回结果
     *
     * @param errorMsg 错误信息
     * @return com.puman.scrm.model.common.Result<T> 返回结果
     * @author bruce.cheng
     * @date 2019-01-24 14:19
     */
    public static <T> Result<T> paramError(String errorMsg) {
        return error(ErrorInfoEnum.PARAM_ERROR.getCode(), errorMsg, ErrorInfoEnum.PARAM_ERROR.getDesc());
    }

    /**
     * 未捕获的错误，返回结果
     *
     * @param throwableMsg 抛出错误信息
     * @return com.puman.scrm.model.common.Result<T> 返回结果
     * @author bruce.cheng
     * @date 2019-01-24 14:21
     */
    public static <T> Result<T> uncaughtError(String throwableMsg) {
        return error(ErrorInfoEnum.UNCAUGHT_ERROR.getCode(), null, ErrorInfoEnum.UNCAUGHT_ERROR.getDesc(), throwableMsg);
    }

    /**
     * 系统错误，返回结果
     *
     * @param errorMsg
     * @param <T>
     * @return
     */
    public static <T> Result<T> systemError(String errorMsg) {
        return error(ErrorInfoEnum.SYSTEM_ERROR.getCode(), errorMsg, ErrorInfoEnum.SYSTEM_ERROR.getDesc());
    }

    /**
     * 业务错误，返回结果
     *
     * @param errorMsg
     * @param <T>
     * @return
     */
    public static <T> Result<T> businessError(String errorMsg) {
        return error(ErrorInfoEnum.BUSiNESS_ERROR.getCode(), errorMsg, ErrorInfoEnum.BUSiNESS_ERROR.getDesc());
    }
}
